"""
合法音频处理工具（仅限已授权文件使用）
环境要求：
1. pip install ffmpeg-python pydub
2. 系统安装FFmpeg并配置环境变量
"""

import os
import ffmpeg
from pydub import AudioSegment
import hashlib
import subprocess

# 配置区（根据实际安装路径修改）
FFMPEG_PATH = r"D:\Users\Hasee\Desktop\新建文件夹\企业\ffmpeg-7.1-full_build\bin\ffmpeg.exe"  # FFmpeg可执行文件路径
TEST_FILE = r"D:\Users\Hasee\Desktop\新建文件夹\企业\output.wav"  # 测试用视频文件路径
OUTPUT_DIR = "output_audio"  # 输出目录


def convert_to_wav(input_path, output_dir):
    """
    音频转换核心函数
    :param input_path: 输入文件路径
    :param output_dir: 输出目录
    :return: 转换后的文件路径
    """
    # 合法性校验
    if not os.path.exists(input_path):
        raise FileNotFoundError("输入文件不存在")

    if os.path.getsize(input_path) > 1024 * 1024 * 500:  # 500MB限制
        raise ValueError("文件大小超过处理限制")

    os.makedirs(output_dir, exist_ok=True)

    # 生成哈希文件名
    file_hash = hashlib.md5(open(input_path, 'rb').read()).hexdigest()
    output_path = os.path.join(output_dir, f"audio_{file_hash[:8]}.wav")

    try:
        # FFmpeg转换（显式指定路径）
        (
            ffmpeg
            .input(input_path)
            .output(output_path,
                    ac=1,  # 单声道
                    ar=16000,  # 16kHz采样率
                    acodec='pcm_s16le',  # 16bit编码
                    loglevel='error')
            .overwrite_output()
            .run(cmd=FFMPEG_PATH,  # 关键配置：显式指定路径
                 capture_stdout=True,
                 capture_stderr=True)
        )

        # 格式验证
        audio = AudioSegment.from_file(output_path)
        if audio.channels != 1 or audio.frame_rate != 16000:
            os.remove(output_path)
            raise ValueError("输出参数不达标")

        print(f"✓ 转换成功: {output_path}")
        return output_path

    except ffmpeg.Error as e:
        print(f"FFmpeg错误: {e.stderr.decode()}")
    except Exception as e:
        print(f"处理失败: {str(e)}")
    return None


def check_environment():
    """环境验证函数"""
    # 验证Python包
    try:
        import ffmpeg
        print("✓ ffmpeg-python 已安装")
    except ImportError:
        print("✗ ffmpeg-python 未安装")
        return False

    # 验证FFmpeg可执行性
    try:
        subprocess.run([FFMPEG_PATH, "-version"],
                       check=True,
                       stdout=subprocess.DEVNULL,
                       stderr=subprocess.DEVNULL)
        print("✓ FFmpeg 工作正常")
        return True
    except Exception as e:
        print(f"✗ FFmpeg验证失败: {str(e)}")
        return False


def prepare_test_file():
    """生成5秒测试视频"""
    if not os.path.exists(TEST_FILE):
        try:
            print("生成测试文件中...")
            (
                ffmpeg
                .input("testsrc=duration=5:size=640x480:rate=30",
                       format="lavfi")
                .output(TEST_FILE, vcodec="libx264", pix_fmt="yuv420p")
                .overwrite_output()
                .run(cmd=FFMPEG_PATH,
                     quiet=True)
            )
        except:
            print("测试文件生成失败")


if __name__ == "__main__":
    print("=== 系统环境验证 ===")
    env_ok = check_environment()

    print("\n=== 功能测试 ===")
    if env_ok:
        prepare_test_file()

        if os.path.exists(TEST_FILE):
            result = convert_to_wav(TEST_FILE, OUTPUT_DIR)
            if result:
                print("测试完成，请检查输出文件")
                os.startfile(OUTPUT_DIR)  # 自动打开输出目录
        else:
            print(f"请手动在目录放置测试文件: {os.path.abspath(TEST_FILE)}")
    else:
        print("请先解决环境配置问题")